package top.kaoshanji.ch04;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import top.kaoshanji.ch04.threaded.ThreadedEchoHandler;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 代码清单 ch04-04：使用多线程的服务器套接字示例(4.2.2节)
 * 1、首先启动程序
 * 2、然后在命令窗口输入： telnet localhost 8189
 * 3、输入什么就会返回什么
 * 4、可以多启动几个命令窗口
 * 5、输入 BYE 可以断开连接，停止程序...这个没有试过
 * author kaoshanji
 * ^_^
 * create time 2024/12/8 9:25
 */
public class ThreadedEchoServer {

    private static final Logger logger = LogManager.getLogger(ThreadedEchoServer.class);

    static final int URL_PORT = 8189;

    public static void main(String[] args) {
        logger.info("...代码清单 ch04-04：使用多线程的服务器套接字示例(4.2.2节)...");

        try (var s = new ServerSocket(URL_PORT)) {
            int i = 1; // 这是线程安全的吗？
            while (true) {
                Socket incoming = s.accept(); // 产生了一个客户端Socket
                System.out.println("Spawning " + i);

                // 这样的变量命名会不会被骂死？可见好像并不能尽信书..
                Runnable r = new ThreadedEchoHandler(incoming);
                var t = new Thread(r);
                t.start();
                i++;
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

}
